package goleetcode

import "math"

type StockSpanner struct {
	stack [][2]int
	idx   int
}

func (ss *StockSpanner) Constructor() StockSpanner {
	return StockSpanner{
		stack: [][2]int{{-1, math.MaxInt32}},
		idx: -1,
	}
}

/*
	调用next时，输入的是新的一天的股票价格，需要返回包含今日在内的，往前数有连续多少日价格是小于等于今天的价格的
	使用单调栈求解，栈的元素是股票价格的下标（即天数）和股票价格的二元数对
	调用next时，先将栈中价格小于等于此时price的元素都弹出，直到遇到一个大于price的值，并将price入栈，计算下标差返回
*/
func (this *StockSpanner) Next(price int) int {
	this.idx++
	for price >= this.stack[len(this.stack)-1][1] {
		this.stack = this.stack[:len(this.stack) - 1]
	}
	this.stack = append(this.stack, [2]int{this.idx, price})
	return this.idx - this.stack[len(this.stack) - 2][0]
}